# -*- coding: utf-8 -*-

"""
Numpy 库使用示例

Numpy 是 Python 中用于科学计算的核心库，尤其擅长处理大型多维数组和矩阵。
"""

import numpy as np

# 1. 创建 Numpy 数组
print("======== 1. 创建 Numpy 数组 ========")
# 从列表创建一维数组
a = np.array([1, 2, 3, 4, 5])
print(f"一维数组: {a}")
print(f"数组类型: {a.dtype}")

# 创建二维数组（矩阵）
b = np.array([[1, 2, 3], [4, 5, 6]])
print(f"二维数组:\n{b}")

# 创建全零数组
zeros = np.zeros((2, 3))
print(f"全零数组:\n{zeros}")

# 创建全一数组
ones = np.ones((3, 2))
print(f"全一数组:\n{ones}")

# 创建一个范围内的数组
seq = np.arange(10, 20, 2) # 从10开始，到20结束（不含），步长为2
print(f"范围数组: {seq}")

# 2. 数组基本运算
print("\n======== 2. 数组基本运算 ========")
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

# 逐元素加法
print(f"x + y = {x + y}")

# 逐元素乘法
print(f"x * 2 = {x * 2}")

# 矩阵乘法
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(f"矩阵 A:\n{A}")
print(f"矩阵 B:\n{B}")
print(f"A dot B (矩阵乘法):\n{np.dot(A, B)}")

# 3. 数组索引和切片
print("\n======== 3. 数组索引和切片 ========")
arr = np.arange(10)
print(f"原数组: {arr}")

# 获取单个元素
print(f"arr[3] = {arr[3]}")

# 切片
print(f"arr[2:5] = {arr[2:5]}")

# 4. 统计运算
print("\n======== 4. 统计运算 ========")
data = np.array([1, 2, 3, 4, 5])
print(f"数据: {data}")
print(f"平均值: {np.mean(data)}")
print(f"标准差: {np.std(data)}")
print(f"最大值: {np.max(data)}")

def run_all_tests():
    print("\n======== Numpy 测试 ========")
    # 测试创建
    assert np.array_equal(np.zeros((2,2)), np.array([[0,0],[0,0]]))
    # 测试运算
    assert np.array_equal(np.array([1,2]) + np.array([3,4]), np.array([4,6]))
    # 测试切片
    assert np.array_equal(np.arange(5)[2:4], np.array([2,3]))
    # 测试统计
    assert np.mean([1,2,3,4,5]) == 3.0
    print("所有 Numpy 测试通过!")

if __name__ == "__main__":
    run_all_tests()